
# 建议录取最低分数线、录取概率与考生排名的关系 demo

import numpy as np
import matplotlib.pyplot as plt
import matplotlib

matplotlib.use('TkAgg')


# 定义Sigmoid函数，使用numpy处理数值计算
def sigmoid(x):
    return 1 / (1 + np.exp(-x))


# 计算考生的录取概率，增加陡度系数参数 steepness
def calculate_admission_probability(B, W, P=0.5, steepness=1):
    # steepness 为陡度系数，它控制着Sigmoid曲线的陡度。
    # 该值越大，曲线越陡，意味着排名的微小变化会引起录取概率的大幅波动；
    # 该值越小，曲线越平缓，排名的变化对录取概率的影响相对较小。
    # 取值范围理论上是(0, +∞)，但在实际应用中，通常会根据具体情况调整，
    # 一般取值在 0.1 到 1 之间比较常见。
    x = steepness * (W - B)
    # 将x代入Sigmoid函数，得到最终的录取概率
    return sigmoid(x)


# 设定可能录用的最低排名
W = 2000
# 设定当考生排名B等于可能录用最低排名W时的录取概率
P = 0.5
# 设定陡度系数
steepness = 0.001
# 生成一系列考生排名B的值，范围从1到40000
B_values = np.arange(1, 40001, 100)
# 用于存储每个考生排名对应的录取概率
probabilities = []

# 遍历每个考生排名B的值
for B in B_values:
    # 调用calculate_admission_probability函数计算当前排名对应的录取概率
    probability = calculate_admission_probability(B, W, P, steepness)
    # 将计算得到的录取概率添加到probabilities列表中
    probabilities.append(probability)

# 使用matplotlib绘制考生排名B与录取概率的关系曲线
plt.plot(B_values, probabilities)
# 设置x轴的标签为“考生排名B”
plt.xlabel('考生排名 B')
# 将x轴标签旋转45度，防止标签过长相互重叠
plt.xticks(rotation=45)
# 设置y轴的标签为“录取概率”
plt.ylabel('录取概率')
# 设置图表的标题为“考生排名与录取概率的关系”
plt.title('考生排名与录取概率的关系')
# 显示网格线，方便观察曲线对应的数据
plt.grid(True)
# 显示绘制好的图表
plt.show()
